package br.org.game.mthread;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;

class ServerWriter extends Thread {

	private ChatServer server;
	private List<PrintStream> outputStreams;
	private String message;

	public ServerWriter(ChatServer chatServer) {
		super(chatServer.getCurrentConnections(), "Server Writer");
		server = chatServer;
		outputStreams = new ArrayList<PrintStream>();
		this.start();
	}

	public void setMessage(String messagem) {
		this.message = messagem;
	}

	public void add(PrintStream printStream) {
		outputStreams.add(printStream);
	}

	@Override
	public synchronized void run() {
		while (true) {
			// A linha faz um laco para sempre, mas na vedade so e executada quando
			// a condicao wait for reinicializada por um notify. Isso num bloco
			// sincronizado para bloquear a linha e evitar o acesso multiplo.
			try {
				this.wait();
			} catch (InterruptedException e) {
				System.out.println("Caught an Interrupted Exception");
			}

			synchronized (server.getConnectionsSocket()) {
				// Imprime a mensagem em cada um OutputStreams.
				for (PrintStream outputStream : outputStreams) {
					outputStream.println(message);
				}
			}
		}
	}

}
